package com.lnsoft.cac.server.handle.codec.frameMessage;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Data;
import lombok.NonNull;

@Data
/**
 * 通信流量数据报-升级启动报文
 * */
public class Upgrade_Start_Msg {
    private byte[] File_Name;               //20byte        文件名，以‘\0’结尾ASCII码字符串，占用20Byte
    private int UpdateFile_Length;          //4byte         文件长度（4字节无符号整数）
    private byte[] MD5_Sum;                 //16byte        文件md5值校验码
    private int Frame_Number;               //2byte         总包数（2字节无符号整数）
    private int Frame_DataLength;           //2byte         单包数据长度（2字节无符号整数，不包括最后一包）


    public ByteBuf toByteBuf() throws Exception{
        if (File_Name == null) {
            throw new Exception("文件名 设置异常");
        }
        if (File_Name.length != 20) {
            throw new Exception("文件名长度 设置异常");
        }
        if (MD5_Sum == null) {
            throw new Exception("文件md5值校验码 设置异常");
        }
        if (MD5_Sum.length != 16) {
            throw new Exception("文件md5值校验码长度 设置异常");
        }

        ByteBuf bf = Unpooled.buffer(44);
        bf.writeBytes(File_Name);
        bf.writeIntLE(UpdateFile_Length);
        bf.writeBytes(MD5_Sum);
        bf.writeShortLE(Frame_Number);
        bf.writeShortLE(Frame_DataLength);
        return bf;
    }



    //  解析 [升级启动] 帧报文内容区 到消息体中
    public static Upgrade_Start_Msg decFrameBody(@NonNull byte[] frameBody) throws Exception {
        ByteBuf bf = Unpooled.wrappedBuffer(frameBody);
        Upgrade_Start_Msg msg = new Upgrade_Start_Msg();
        int len = frameBody.length;
        if (len == 0) {
            return null;
        }
        if (44 != len) {
            throw new Exception("frameBody 数据异常");
        }
        byte[] File_Name = new byte[20];
        bf.getBytes(0, File_Name, 0, 20);
        msg.setFile_Name(File_Name);
        msg.setUpdateFile_Length(bf.getIntLE(20) & 0xFFFFFFFF);
        byte[] MD5_Sum = new byte[16];
        bf.getBytes(24, MD5_Sum, 0, 16);
        msg.setMD5_Sum(MD5_Sum);
        msg.setFrame_Number(bf.getUnsignedShortLE(40));
        msg.setFrame_DataLength(bf.getUnsignedShortLE(42));
        return msg;
    }
}
